package com.ayjsolutions.marcadoresfutbol.database;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

import com.ayjsolutions.marcadoresfutbol.PartidoLista;
import com.ayjsolutions.marcadoresfutbol.service.PartidoUpdated;
import com.ayjsolutions.marcadoresfutbol.util.Utiles;

/**
 * This class will be used to acces the database and modify it
 */
public class DBPartidosLista {

	/** The database. */
	private SQLiteDatabase database;

	/** The class where the information is stored. */
	private SQLPartidosLista dbPartidosLista;

	/** The database columns */
	private String[] allColumns = { SQLPartidosLista.ID, SQLPartidosLista.CASA,
			SQLPartidosLista.FUERA, SQLPartidosLista.GOLES_CASA,
			SQLPartidosLista.GOLES_FUERA, SQLPartidosLista.TIEMPO,
			SQLPartidosLista.LIGA, SQLPartidosLista.URL,
			SQLPartidosLista.FOLLOW };

	/**
	 * Instantiates a new dB partidos lista.
	 * 
	 * @param context
	 *            the context
	 */
	public DBPartidosLista(Context context) {
		dbPartidosLista = new SQLPartidosLista(context);
	}

	/**
	 * Open the database
	 * 
	 * @throws SQLException
	 *             the sQL exception
	 */
	public void open() {
		try {
			database = dbPartidosLista.getWritableDatabase();
		} catch (Exception e){
			e.printStackTrace();
		}
	}

	/**
	 * Close the database
	 */
	public void close() {
		database.close();
	}

	/**
	 * Adds a match to the database. Returns the same match.
	 * 
	 * @param in
	 *            the partidoLista
	 * @return the partidoLista
	 */
	public PartidoLista crearPartidoLista(PartidoLista in) {

		ContentValues values = new ContentValues();

		values.put(SQLPartidosLista.CASA, in.getHomeTeam().replace("'", ""));
		values.put(SQLPartidosLista.FUERA, in.getVisitorTeam().replace("'", ""));
		values.put(SQLPartidosLista.GOLES_CASA, in.getHomeGoals());
		values.put(SQLPartidosLista.GOLES_FUERA, in.getVisitorGoals());
		values.put(SQLPartidosLista.TIEMPO, in.getTime());
		values.put(SQLPartidosLista.LIGA, in.getLiga().replace("'", ""));
		values.put(SQLPartidosLista.URL, in.getURL().replace("?s=2", "")
				.replace("?s=1", "").replace("?s=3", ""));
		values.put(SQLPartidosLista.FOLLOW, "0");

		long insertId = 0;

		if (in.getId() == 0) {

			// if we do not have a previous id (that is, we are not refreshing)
			// we create a new row
			insertId = database.insert(SQLPartidosLista.NOMBRE_TABLA, null,
					values);
			in.setId(insertId);
		}

		Log.w(Utiles.getLogTags(2), Utiles.getLogComments(Utiles.getLogTags(2))
				+ insertId);

		Cursor cursor = database.query(SQLPartidosLista.NOMBRE_TABLA,
				allColumns, SQLPartidosLista.ID + " = " + insertId, null, null,
				null, null);

		cursor.moveToFirst();

		cursor.close();

		return in;

	}

	/**
	 * Deletes a match.
	 * 
	 * @param in
	 *            the in
	 */
	public void deletePartido(PartidoLista in) {

		String URL = in.getURL();

		Log.w(Utiles.getLogTags(6),
				Utiles.getLogComments(Utiles.getLogTags(6) + URL));
		database.delete(SQLPartidosLista.NOMBRE_TABLA, SQLPartidosLista.URL
				+ " = " + URL, null);

	}

	/**
	 * Gets the partido from the url.
	 * 
	 * @param URL
	 *            the url
	 * @return the partido from url
	 */
	public PartidoLista getPartidoFromURL(String URL) {

		PartidoLista res = new PartidoLista();

		Cursor cursor = null;
		cursor = database.query(SQLPartidosLista.NOMBRE_TABLA, allColumns,
				SQLPartidosLista.URL + " = \'" + URL + "\'", null, null, null,
				null);

		cursor.moveToFirst();

		if (!cursor.isAfterLast()) {
			res = cursorToPartido(cursor);
		}
		
		cursor.close();

		return res;

	}

	/**
	 * Refresh the match.
	 * 
	 * @param in
	 *            the partidoLista
	 */
	public void refreshPartido(PartidoLista in) {

		// We obtain the id

		long id = getPartidoFromURL(in.getURL()).getId();
		in.setId(id);

		ContentValues values = new ContentValues();

		values.put(SQLPartidosLista.CASA, in.getHomeTeam());
		values.put(SQLPartidosLista.FUERA, in.getVisitorTeam());
		values.put(SQLPartidosLista.GOLES_CASA, in.getHomeGoals());
		values.put(SQLPartidosLista.GOLES_FUERA, in.getVisitorGoals());
		values.put(SQLPartidosLista.TIEMPO, in.getTime());
		values.put(SQLPartidosLista.LIGA, in.getLiga());
		values.put(SQLPartidosLista.URL, in.getURL());
		values.put(SQLPartidosLista.ID, in.getId());
		values.put(SQLPartidosLista.FOLLOW, in.getFollow());

		// We delete the row
		if (!in.getURL().equals("liga")) {
			try {
				database.update(SQLPartidosLista.NOMBRE_TABLA, values,
						SQLPartidosLista.ID + " = " + id, null);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

	}

	public List<PartidoUpdated> updatePartido(
			List<PartidoLista> partidosUpdate,
			List<PartidoLista> partidosNuevos, Context context) {

		List<PartidoUpdated> out = new ArrayList<PartidoUpdated>();

		for (PartidoLista partidoNuevo : partidosNuevos) {
			refreshPartido(partidoNuevo);
		}

		for (PartidoLista partidoViejo : partidosUpdate) {

			boolean gol = false;
			boolean end = false;
			boolean start = false;

			String url = partidoViejo.getURL();
			PartidoLista partidoToUpdate = new PartidoLista();

			for (PartidoLista partidoNuevo : partidosNuevos) {
				if (partidoNuevo.getURL().equals(url)) {
					partidoNuevo.setFollow("1");
					refreshPartido(partidoNuevo);
					partidoToUpdate = partidoNuevo;
					break;
				}

			}

			if (!partidoToUpdate.getURL().equals("undefined")){
			Log.i("Refreshing",
					"Refreshing match number " + partidoViejo.getId());

			Log.i("COMPARE", "Previous data: " + partidoViejo.getHomeGoals()
					+ " - " + partidoViejo.getVisitorGoals() + " - "
					+ partidoViejo.getTime());
			Log.i("COMPARE", "Current data: " + partidoToUpdate.getHomeGoals()
					+ " - " + partidoToUpdate.getVisitorGoals() + " - "
					+ partidoToUpdate.getTime());

			if (!partidoToUpdate.getHomeGoals().equals(
					partidoViejo.getHomeGoals())
					|| !partidoToUpdate.getVisitorGoals().equals(
							partidoViejo.getVisitorGoals())) {
				// GOL
				Log.i("COMPARE", "Goal");
				gol = true;
			}
			if (!partidoToUpdate.getTime().contains("'")
					&& !partidoToUpdate.getTime().contains("HT")
					&& partidoViejo.getTime().contains("'")) {
				// End of match
				Log.i("COMPARE", "END");
				end = true;
			}
			if (partidoToUpdate.getTime().contains("'")
					&& !partidoViejo.getTime().contains("'")
					&& !partidoViejo.getTime().contains("HT")) {
				// Start of match
				Log.i("COMPARE", "START");
				start = true;
			}
			} else {
				Log.i("COMPARE", "No data. Probably no network available");
			}

			PartidoUpdated partidoUpdated = new PartidoUpdated(partidoToUpdate);

			boolean[] states = { gol, end, start };
			partidoUpdated.setStates(states);
			out.add(partidoUpdated);
		}

		return out;
	}

	/**
	 * Gets all matches and leagues (that is, all the items).
	 * 
	 * @return the all partidos and ligas
	 */
	public List<PartidoLista> getAllPartidosAndLigas() {

		List<PartidoLista> res = new ArrayList<PartidoLista>();

		Cursor cursor = null;

		try {
			cursor = database.query(SQLPartidosLista.NOMBRE_TABLA, allColumns,
					null, null, null, null, null);
		} catch (Exception e) {
			e.getMessage();
		}

		cursor.moveToFirst();

		while (!cursor.isAfterLast()) {

			res.add(cursorToPartido(cursor));
			cursor.moveToNext();

		}
		
		cursor.close();

		return res;

	}

	/**
	 * Gets the matches from a certain league.
	 * 
	 * @param in
	 *            the in
	 * @param status
	 *            (LIVE, FINISHED, etc.)
	 * @return the partidos from liga
	 */
	public List<PartidoLista> getPartidosFromLiga(String in, String status) {

		Log.w(Utiles.getLogTags(4), Utiles.getLogComments(Utiles.getLogTags(4))
				+ in);

		List<PartidoLista> res = new ArrayList<PartidoLista>();

		Cursor cursor = null;

		try {

			if (status.equals("directo")) {
				cursor = database.query(SQLPartidosLista.NOMBRE_TABLA,
						allColumns, SQLPartidosLista.LIGA + " = \"" + in
								+ "\" AND " + SQLPartidosLista.TIEMPO
								+ " LIKE '  %'", null, null, null, null);
			} else {
				cursor = database.query(SQLPartidosLista.NOMBRE_TABLA,
						allColumns,
						SQLPartidosLista.LIGA + " = \"" + in + "\"", null,
						null, null, null);
			}
		} catch (Exception e) {
			e.getMessage();
		}

		cursor.moveToFirst();

		while (!cursor.isAfterLast()) {

			PartidoLista partido = cursorToPartido(cursor);
			if (!partido.getHomeTeam().equals("liga"))
				res.add(partido);
			cursor.moveToNext();

		}
		
		cursor.close();

		return res;

	}

	/**
	 * Gets all the leagues.
	 * 
	 * @return the ligas
	 */
	public List<PartidoLista> getLigas() {

		List<PartidoLista> res = new ArrayList<PartidoLista>();

		Cursor cursor = null;

		try {
			cursor = database.query(SQLPartidosLista.NOMBRE_TABLA, allColumns,
					SQLPartidosLista.FUERA + " = \'liga\'", null, null, null,
					SQLPartidosLista.ID);
		} catch (Exception e) {
			e.getMessage();
		}

		cursor.moveToFirst();

		while (!cursor.isAfterLast()) {

			PartidoLista partido = cursorToPartido(cursor);
			res.add(partido);
			cursor.moveToNext();

		}
		
		cursor.close();

		return res;

	}

	/**
	 * Cursor to match. Obtains a db row and creates a PartidoLista
	 * 
	 * @param cursor
	 *            the cursor
	 * @return the partido lista
	 */
	public PartidoLista cursorToPartido(Cursor cursor) {

		PartidoLista res = new PartidoLista();

		res.setHomeGoals(cursor.getString(cursor
				.getColumnIndex(SQLPartidosLista.GOLES_CASA)));
		res.setVisitorGoals(cursor.getString(cursor
				.getColumnIndex(SQLPartidosLista.GOLES_FUERA)));
		res.setHomeTeam(cursor.getString(cursor
				.getColumnIndex(SQLPartidosLista.CASA)));
		res.setVisitorTeam(cursor.getString(cursor
				.getColumnIndex(SQLPartidosLista.FUERA)));
		res.setTime(cursor.getString(cursor
				.getColumnIndex(SQLPartidosLista.TIEMPO)));
		res.setLiga(cursor.getString(cursor
				.getColumnIndex(SQLPartidosLista.LIGA)));
		res.setURL(cursor.getString(cursor.getColumnIndex(SQLPartidosLista.URL)));
		res.setId(cursor.getLong(cursor.getColumnIndex(SQLPartidosLista.ID)));
		res.setFollow(cursor.getString(cursor
				.getColumnIndex(SQLPartidosLista.FOLLOW)));

		return res;

	}

	/**
	 * Gets the leagues with one or more live matches
	 * 
	 * @return the ligas directo
	 */
	public ArrayList<String> getLigasDirecto() {

		List<PartidoLista> ligas = getLigas();
		ArrayList<String> res = new ArrayList<String>();

		for (PartidoLista liga : ligas) {
			try {
				String nombreLiga = liga.getLiga();

				Cursor mCount = database
						.rawQuery(
								"select count(*) from "
										+ SQLPartidosLista.NOMBRE_TABLA
										+ " where " + SQLPartidosLista.LIGA
										+ " = '"
										+ nombreLiga.replace("'", "%'")
										+ "' and " + SQLPartidosLista.TIEMPO
										+ " LIKE '  %'", null);
				mCount.moveToFirst();
				int count = mCount.getInt(0);

				if (count != 0) {
					res.add(nombreLiga);
				}
				
				mCount.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		

		return res;
	}

	public List<PartidoLista> getPartidosToUpdate() {

		List<PartidoLista> res = new ArrayList<PartidoLista>();

		Cursor cursor = null;

		try {
			cursor = database.query(SQLPartidosLista.NOMBRE_TABLA, allColumns,
					SQLPartidosLista.FOLLOW + " = \'1\'", null, null, null,
					SQLPartidosLista.LIGA);
		} catch (Exception e) {
			e.getMessage();
		}

		cursor.moveToFirst();

		while (!cursor.isAfterLast()) {

			PartidoLista partido = cursorToPartido(cursor);
			res.add(partido);
			cursor.moveToNext();

		}
		
		cursor.close();

		return res;
	}

	public List<String> getPartidosLiveInDB() {

		List<String> res = new ArrayList<String>();

		Cursor cursor = null;

		try {
			cursor = database.query(SQLPartidosLista.NOMBRE_TABLA, allColumns,
					SQLPartidosLista.TIEMPO + " LIKE '  %'", null, null, null,
					SQLPartidosLista.LIGA);
		} catch (Exception e) {
			e.getMessage();
		}

		cursor.moveToFirst();

		while (!cursor.isAfterLast()) {

			PartidoLista partido = cursorToPartido(cursor);
			res.add(partido.getURL());
			cursor.moveToNext();

		}
		
		cursor.close();

		return res;
	}

	public int changeStatePartido(PartidoLista in) {

		int res;

		// We obtain the id

		PartidoLista partidoAntiguo = getPartidoFromURL(in.getURL());

		long id = partidoAntiguo.getId();
		in.setId(id);

		ContentValues values = new ContentValues();

		values.put(SQLPartidosLista.CASA, in.getHomeTeam());
		values.put(SQLPartidosLista.FUERA, in.getVisitorTeam());
		values.put(SQLPartidosLista.GOLES_CASA, in.getHomeGoals());
		values.put(SQLPartidosLista.GOLES_FUERA, in.getVisitorGoals());
		values.put(SQLPartidosLista.TIEMPO, in.getTime());
		values.put(SQLPartidosLista.LIGA, in.getLiga());
		values.put(SQLPartidosLista.URL, in.getURL());
		values.put(SQLPartidosLista.ID, in.getId());

		if (partidoAntiguo.getFollow().equals("1")) {
			res = 0;
		} else {
			res = 1;
		}

		values.put(SQLPartidosLista.FOLLOW, Integer.toString(res));

		// We delete the row
		if (!in.getURL().equals("liga")) {
			try {
				database.update(SQLPartidosLista.NOMBRE_TABLA, values,
						SQLPartidosLista.ID + " = " + id, null);
			} catch (Exception e) {
				e.printStackTrace();
			}
			// We create the row again with the new data
			crearPartidoLista(in);
		}

		return res;
	}

	public String getDBDate() {

		String res = "non";

		Cursor cursor = null;
		PartidoLista partido = null;
		long id = 1;

		try {
			cursor = database.query(SQLPartidosLista.NOMBRE_TABLA, allColumns,
					SQLPartidosLista.ID + " = " + id, null, null, null,
					SQLPartidosLista.ID);
		} catch (Exception e) {
			e.getMessage();
		}

		cursor.moveToFirst();

		while (!cursor.isAfterLast()) {

			partido = cursorToPartido(cursor);
			cursor.moveToNext();
			res = partido.getTime();

		}
		
		cursor.close();

		return res;
	}

	public ArrayList<String> getPartidosToUpdateString() {

		List<PartidoLista> partidosToUpdate = getPartidosToUpdate();
		ArrayList<String> res = new ArrayList<String>();

		for (PartidoLista partido : partidosToUpdate) {
			res.add(partido.getURL());
		}

		return res;
	}

}
